package com.input4hua.expr.time.untils;

import java.util.Date;

import org.joda.time.*;

/**
 * 时间计算工具类
 *
 * @author Jiahua.hu
 * @since 13 May 2019
 */
public class TimeCalcUtils {

	/**
	 * 当前时间
	 * @return
	 */
	public static Date now() {
		DateTime dateTime = DateTime
				.now();
		return dateTime.toDate();
	}


	/**
	 * 明天的当前时间
	 * @return
	 */
	public static Date tomorrow() {
		return nextDays(1);
	}

	/**
	 * 后i天
	 * @param i
	 * @return
	 */
	public static Date nextDays(int i) {
		DateTime dateTime = DateTime
				.now()
				.plusDays(i);
		return dateTime.toDate();
	}

	/**
	 * 昨天的当前时间
	 * @return
	 */
	public static Date yesterday() {
		return prevDays(1);
	}

	/**
	 * 前i天
	 * @param i
	 * @return
	 */
	public static Date prevDays(int i) {
		DateTime dateTime = DateTime
				.now()
				.minusDays(i);
		return dateTime.toDate();
	}

	/**
	 * 后i小时
	 * @param i
	 * @return
	 */
	public static Date nextHours(int i) {
		DateTime dateTime = DateTime
				.now()
				.plusHours(i);
		return dateTime.toDate();
	}

	/**
	 * 前i小时
	 * @param i
	 * @return
	 */
	public static Date prevHours(int i) {
		DateTime dateTime = DateTime
				.now()
				.minusHours(i);
		return dateTime.toDate();
	}

	/**
	 * 指定日期的后 i小时
	 * @param date
	 * @param i
	 * @return
	 */
	public static Date nextHours(Date date, int i) {
		DateTime dateTime = new DateTime(date)
				.plusHours(i);
		return dateTime.toDate();
	}

	/**
	 * 指定日期的前 i小时
	 * @param date
	 * @param i
	 * @return
	 */
	public static Date prevHours(Date date, int i) {
		DateTime dateTime = new DateTime(date)
				.minusHours(i);
		return dateTime.toDate();
	}

	/**
	 * 今天的开始时刻
	 * @return
	 */
	public static Date todayBegin() {
		return DateTime
				.now()
				.withTimeAtStartOfDay().toDate();
	}

	/**
	 * 今天的结束时刻
	 * @return
	 */
	public static Date todayEnd() {
		return DateTime
				.now()
				.millisOfDay()
				.withMaximumValue()
				.toDate();
	}

	/**
	 * 当前周的第一天
	 * @return
	 */
	public static Date firstDayOfWeek() {
		LocalDate dateTime = LocalDate.now().dayOfWeek().withMinimumValue();
		return dateTime.toDate();
	}

	/**
	 * 当前周的最后一天
	 * @return
	 */
	public static Date lastDayOfWeek() {
		LocalDate dateTime = LocalDate.now().dayOfWeek().withMaximumValue();
		return dateTime.toDate();
	}

	/**
	 * 当月的第一天
	 * @return
	 */
	public static Date firstDayOfMonth() {
		LocalDate dateTime = LocalDate.now().dayOfMonth().withMinimumValue();
		return dateTime.toDate();
	}

	/**
	 * 当月的最后一天
	 * @return
	 */
	public static Date lastDayOfMonth() {
		LocalDate dateTime = LocalDate.now().dayOfMonth().withMaximumValue();
		return dateTime.toDate();
	}

	/**
	 * 当年的第一天
	 * @return
	 */
	public static Date firstDayOfYear() {
		LocalDate dateTime = LocalDate.now().dayOfYear().withMinimumValue();
		return dateTime.toDate();
	}

	/**
	 * 当年的最后一天
	 * @return
	 */
	public static Date lastDayOfYear() {
		LocalDate dateTime = LocalDate.now().dayOfYear().withMaximumValue();
		return dateTime.toDate();
	}

	/**
	 * 相差天数
	 * @param begin
	 * @param end
	 * @return
	 */
	public static long daysOfDiffer(Date begin, Date end) {
		return new Duration(new DateTime(begin), new DateTime(end)).getStandardDays();
	}

	/**
	 * 相差小时数
	 * @param begin
	 * @param end
	 * @return
	 */
	public static long hoursOfDiffer(Date begin, Date end) {
		return new Duration(new DateTime(begin), new DateTime(end)).getStandardHours();
	}

	/**
	 * 相差分钟数
	 * @param begin
	 * @param end
	 * @return
	 */
	public static long minutesOfDiffer(Date begin, Date end) {
		return new Duration(new DateTime(begin), new DateTime(end)).getStandardMinutes();
	}

	/**
	 * 相差秒数
	 * @param begin
	 * @param end
	 * @return
	 */
	public static long secondsOfDiffer(Date begin, Date end) {
		return new Duration(new DateTime(begin), new DateTime(end)).getStandardSeconds();
	}

	/**
	 * 指定日期是否在选定日期里
	 * @param index
	 * @param begin
	 * @param end
	 * @return
	 */
	public static boolean indexOfDays(Date index, Date begin, Date end) {
		return new Interval(new DateTime(begin), new DateTime(end)).contains(new DateTime(index));
	}

	/**
	 * 指定时间月是否是闰月
	 * @param date
	 * @return
	 */
	public static boolean leapOfMonth(Date date) {
		return new DateTime(date).monthOfYear().isLeap();
	}

	/**
	 * 指定时间年是否是闰年
	 * @param date
	 * @return
	 */
	public static boolean leapOfYear(Date date) {
		return new DateTime(date).year().isLeap();
	}
}
